home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CU Amiga Super CD-ROM 21
/
CU Amiga Magazine's Super CD-ROM 21 (1998)(EMAP Images)(GB)[!][issue 1998-04].iso
/
CUCD
/
Programming
/
Python-1.4
/
Source
/
Amiga
/
Python_netlib
/
_fstat.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-11-16
|
2KB
|
81 lines
RCS_ID_C="$Id: _fstat.c,v 4.2 1995/09/17 20:52:30 jraja Exp $";
/*
* _fstat.c - fstat() for Network Support Library (SAS/C)
*
* Copyright © 1994 AmiTCP/IP Group,
* Network Solutions Development Inc.
* All rights reserved.
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
/* DOS 3.0 and MuFS extensions to file info block */
#include "fibex.h"
#include <proto/dos.h>
#include <proto/utility.h>
#include <ios1.h>
#include "libcheck.h"
int fstat(int fd, struct stat *st)
{
struct UFB *ufb = chkufb(fd);
if (st == NULL || ((1 & (long)st) == 1)) {
errno = EFAULT;
return -1;
}
if (ufb == NULL || ufb->ufbflg == 0) {
errno = EBADF;
return -1;
}
if (ufb->ufbflg & UFB_SOCK) { /* a socket */
long value;
long size = sizeof(value);
/* Needs both usergroup.library and bsdsocket.library -- I.J. */
if(!checkusergrouplib() || !checkbsdsocketlib()) return -1;
bzero(st, sizeof(*st));
/* st->st_dev = ??? */
st->st_mode = S_IFSOCK | S_IRUSR | S_IWUSR;
st->st_uid = geteuid();
st->st_gid = getegid();
if (getsockopt(fd, SOL_SOCKET, SO_SNDBUF, &value, &size) == 0)
st->st_blksize = value;
return 0;
} else { /* ordinal file */
/* test if it is a NIL: file handle (ExamineFH() crashes on those!) */
if (((struct FileHandle *)BADDR((BPTR)ufb->ufbfh))->fh_Type == NULL) {
/* It is NIL:, make up something... */
bzero(st, sizeof(*st));
st->st_mode = S_IFIFO | S_IRWXU | S_IRWXG | S_IRWXO;
return 0;
}
else {
if (ExamineFH(ufb->ufbfh, __dostat_fib)) {
__dostat(__dostat_fib, st);
st->st_dev = (dev_t)((struct FileHandle *)BADDR(ufb->ufbfh))->fh_Type;
return 0;
} else {
errno = EIO;
return -1;
}
}
}
}